﻿package com.calefk.core  {
	
    import com.calefk.util.FadeAlpha;
    import com.calefk.util.TransitionFade;
    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
    
	public class PageManager {
        /**
         * Crea una instancia de PageName , sirve para almacenar la clase y el nombre del clip 
         * que se utilizaran cuando se cree una Pagina.
         * @param	className
         * @param	clipName
         */
        public static function addPN(className:Class , clipName:String):PageName {
           var pn:PageName = new PageName();
           pn.className = className;
           pn.clipName = clipName;
           return pn;
        }
		
		protected var mCurrentPage:Page;
		protected var mCanvas:MovieClip;
        
        protected var mCanvasObjects   :MovieClip;
        protected var mCanvasTransition:MovieClip;
        
        // vars to transition fade normal
        protected var mTransitionFade:TransitionFade;
        protected var mIdPageTransition:PageName;
        protected var mCallFunction:String;
        protected var mInstanceParameter:*;
        
        // vars to transition fade alpha
        protected var mFadeAlpha:FadeAlpha;
        protected var mWidthFadeAlpha :Number;
        protected var mHeightFadeAlpha:Number;
        protected var mInTimeFadeAlpha :Number;
        protected var mOutTimeFadeAlpha:Number;
		
		public function PageManager(canvas:MovieClip) {
            mCanvasObjects = new MovieClip();
            mCanvasTransition = new MovieClip();
            
            canvas.addChild(mCanvasObjects);
            canvas.addChild(mCanvasTransition);
            
			mCanvas = canvas;
		}

        /**
         *  Permite realizar un fade antes (in) y despues(out) de ir a la pagina siguiente.
         * @param	inTime cantidad de tiempo en tapar toda la pantalla está milisegundos
         * @param	outTime cantidad de tiempo en desaparecer el fade de toda la pantalla está en milisegundos
         * @param	idPage es el pageName esas variables deben ser creadas en PMGame
         * @param	instanceParameter parametro de instancia que es enviando con el metodo init , el metodo init es llamado despues de gotoPage
         * @param	callFunction funcion a la que se llamará cuando termine el fade tanto de "in" como de "out"
         * @param	background color en hexadecimales que tomará el fade
         * @param	pw ancho del fade , si es -1 tomará el tamaño del proyecto Project.PW
         * @param	ph alto del fade , si es -1 tomará el tamaño del proyecto Project.PH
         */
        public function onTransition(inTime:int , outTime:int , idPage:PageName ,
                 instanceParameter:* = null , callFunction:String = null , background:int = 0x000000 , pw:int = -1 , ph:int = -1):void {
            mIdPageTransition = idPage;
            mCallFunction = callFunction;
            mInstanceParameter = instanceParameter;
            
            if (pw == -1) {
                pw = Project.PW;
            }
            
            if (ph == -1) {
                ph = Project.PH;
            }
            
            mTransitionFade = new TransitionFade(mCanvasTransition, 
                    background, inTime , outTime, endInFade , endOutFade , pw , ph);
            
        }
        /**
         * Es un Fade de transparencia , modifica el alpha de las paginas
         * @param	currentPage pagina actual a la que se hará el fade
         * @param	inTime  cantidad de tiempo que terminará de aparacer la siguiente pagina , está en milisegundos
         * @param	outTime cantidad de tiempo que desaparecerá la pagina actual
         * @param	idPage es el pageName , representa la pagina a donde queremos ir
         * @param	instanceParameter parametro que será enviado con el metodo "init", el metodo init es llamado despues de "gotoPage"
         * @param	callFunction función que será llamado luego de terminar todos los fades de transparencia (in y out)
         * @param	pw ancho del clip lock , el clip clock es un sprite que impide tener intertacción con la pagina actual (como los eventos del Mouse)
         * @param	ph alto del clip lock
         */
        public function onTransitionAlpha(currentPage:Page , inTime:int , outTime:int , idPage:PageName ,
            instanceParameter:* = null, callFunction:String = null , pw:int = -1 , ph:int = -1):void {
            
            mIdPageTransition = idPage;
            mCallFunction = callFunction;
            mInstanceParameter = instanceParameter;
            
            mInTimeFadeAlpha  = inTime;
            mOutTimeFadeAlpha = outTime;
            
            if (pw == -1) {
                pw = Project.PW;
            }
            
            if (ph == -1) {
                ph = Project.PH;
            }
            
            mFadeAlpha = new FadeAlpha(currentPage.clip , pw , ph);
            mFadeAlpha.startFade(FadeAlpha.FADE_OUT , endOutFadeAlpha , mOutTimeFadeAlpha);
            
        }
        
        private function endOutFadeAlpha():void {
            gotoPage(mIdPageTransition);
            
            // enviando el parametro de instancia
            mCurrentPage.init(mInstanceParameter);
            
            var w:Number = mFadeAlpha.width;
            var h:Number = mFadeAlpha.height;
            
            mFadeAlpha.clean();
            mFadeAlpha = null;
            
            mFadeAlpha = new FadeAlpha(mCurrentPage.clip , w , h);
            mFadeAlpha.startFade(FadeAlpha.FADE_IN , endInFadeAlpha  , mInTimeFadeAlpha); 
        }
        
        private function endInFadeAlpha():void {
            mFadeAlpha.clean();
            mFadeAlpha = null;
            
            // call function from current page 
            if (mCallFunction != null) {
                mCurrentPage[mCallFunction]();
            }
        }
        
        private function endInFade():void {
            gotoPage(mIdPageTransition);
                        
            // enviando el parametro de instancia
            mCurrentPage.init(mInstanceParameter);
        }
        
        private function endOutFade():void {
            // clean Transition Fade
            mTransitionFade.clean();
            mTransitionFade = null;
            
            // call function from current page 
            if (mCallFunction != null) {
                mCurrentPage[mCallFunction]();
            }
        }
		/**
		 * Me dirige hacia una nueva pagina limpiando la actual
		 * @param	id
		 */
		public function gotoPage(idMovieClip:PageName):void {
			if (mCurrentPage) {
				mCurrentPage.clean();
				mCurrentPage = null;
			}
			
		}
		
		public function update(dt:int):void {			
			if (mCurrentPage) {
				mCurrentPage.update(dt);
			}
		}
		
		public function onKeyDown(e:KeyboardEvent):void {
			if (mCurrentPage) {
				mCurrentPage.onKeyDown(e);
			}
		}
		
		public function onKeyUp(e:KeyboardEvent):void {
			if (mCurrentPage) {
				mCurrentPage.onKeyUp(e);
			}
		}
		
		public function clean():void {			
			if (mCurrentPage) {
				mCurrentPage.clean();
				mCurrentPage = null;
			}
            
            if (mTransitionFade) {
                mTransitionFade.clean();
                mTransitionFade = null;
            }
            
            mCanvas.removeChild(mCanvasObjects);
            mCanvas.removeChild(mCanvasTransition);
            
            mCanvasObjects = null;
            mCanvasTransition = null;
            
            mCanvas = null;
		}	
	}
}